/**
 * 埋点工具
 * import { trackEvent } from '@/util/buried'
 * trackEvent('button_click', { button_id: 'signup', user_id: '12345' })
 */
import { userContext } from '@/contexts/userContext'
import axios from 'axios'
import { useContext } from 'react'

export interface ClickBuriedProps {
  event_name: string // 按haihe数据埋点接口中的【埋点功能】列进行区分
  event_type?: '菜单' | '按钮' | '接口' | '停留时长' | string // 后端统一为接口，前端根据需要使用不同类型
  module?: '提示词模块' | '知识库模块' | '插件模块' | '智能体模块' | string
  page?:
    | '提示词页面'
    | '创建提示词弹窗'
    | '编辑提示词弹窗'
    | '知识库页面'
    | '创建知识库页面'
    | '编辑知识库页面'
    | '文件列表页面'
    | '文件预览页面'
    | '管理标签弹窗'
    | '插件页面'
    | '自定义插件页面'
    | '版本记录弹窗'
    | '创建自定义插件页面'
    | '编辑自定义插件页面'
    | '智能体页面'
    | '创建智能体弹窗'
    | '编辑智能体弹窗'
    | '智能体配置页面'
    | '企业管理页面'
    | '用户管理页面'
    | string // 按haihe数据埋点接口中的【页面】列进行区分
  user_id?: string | number // 用户id
  enterprise_id?: string | number // 企业id
  data_id?: string | number // 提示词 ID、知识库 ID、智能体 ID、插件 ID 等
  create_timestamp?: string // 创建时间后端接口自动填充
  dwell_timed?: number // 页面停留时长
  detail?: string // 存储详细信息json格式 ，例如 detail: JSON.stringify({ 类型: values.catetory, 模型: values.model, 结果: '成功' })
}

const timeInterval = 10 * 1000 // 默认上报事件间隔10s
const eventList = [] // 待上传的埋点事件
let lastTime = 0 // 上次埋点事件上报事件

let submitTimer = null
let buriedTimer = null

const submitBuriedEvent = () => {
  lastTime = new Date().getTime()
  const subList = eventList.slice()
  console.log('submitBuriedEvent', subList)
  eventList.length = 0
  if (window.location.host.startsWith('haihe-uat')) {
    console.log('UAT环境不存储埋点信息', window.location.host)
    return
  }
  axios
    .post(
      '/api/v1/user/events',
      { data: subList },
      {
        headers: {
          'Content-Type': 'application/json'
        }
      }
    )
    .then(() => {
      console.log('buriedEvent Success')
    })
    .catch(error => {
      console.error('buriedEvent Error:', error)
    })
}

export function useBuriedEvent() {
  const { user } = useContext(userContext)

  // 提交埋点信息，存在埋点事件10条或者等待10s时调存储接口
  const submit = () => {
    clearTimeout(submitTimer)
    if (eventList.length >= 10) {
      submitBuriedEvent()
    } else {
      const waitTime = lastTime ? timeInterval - (new Date().getTime() - lastTime) : timeInterval
      submitTimer = setTimeout(
        () => {
          submitBuriedEvent()
        },
        waitTime > 0 ? waitTime : 0
      )
    }
  }

  // 统一埋点，延迟100毫秒, 默认100ms间隔内的响应事件为非用户主动操作
  const buriedEvent = (event: ClickBuriedProps) => {
    clearTimeout(buriedTimer)
    buriedTimer = setTimeout(() => {
      const payload = {
        ...event,
        data_id: event.data_id || event.data_id === 0 ? String(event.data_id) : null,
        user_id: String(user.user_id), // 用户id
        enterprise_id: user.enterprise_id, // 企业id
        create_timestamp: new Date().getTime()
      }
      console.log('buriedEvent:', payload)
      eventList.push(payload)
      submit()
    }, 100)
  }

  // 菜单埋点
  const menuBuriedEvent = (event: ClickBuriedProps) => {
    const payload = {
      event_type: '菜单',
      ...event
    }
    buriedEvent(payload)
  }

  // 提示词模块
  const callWordBuriedEvent = (event: ClickBuriedProps) => {
    const payload = {
      module: '提示词模块',
      page: '提示词页面',
      event_type: '按钮',
      ...event
    }
    buriedEvent(payload)
  }

  // 知识库模块埋点
  const fileLibBuriedEvent = (event: ClickBuriedProps) => {
    const payload = {
      module: '知识库模块',
      page: '知识库页面',
      event_type: '按钮',
      ...event
    }
    buriedEvent(payload)
  }

  // 插件模块埋点
  const pluginBuriedEvent = (event: ClickBuriedProps) => {
    const payload = {
      module: '插件模块',
      page: '插件页面',
      event_type: '按钮',
      ...event
    }
    buriedEvent(payload)
  }

  // 智能体模块埋点
  const applicationBuriedEvent = (event: ClickBuriedProps) => {
    const payload = {
      module: '智能体模块',
      page: '智能体页面',
      event_type: '按钮',
      ...event
    }
    buriedEvent(payload)
  }
  // 智能体模块埋点
  const skillsBuriedEvent = (event: ClickBuriedProps) => {
    const payload = {
      module: '工作流模块',
      page: '工作流页面',
      event_type: '按钮',
      ...event
    }
    buriedEvent(payload)
  }

  // 企业管理模块
  const FirmBuriedEvent = (event: ClickBuriedProps) => {
    const payload = {
      module: '企业管理模块',
      page: '企业管理页面',
      event_type: '按钮',
      ...event
    }
    buriedEvent(payload)
  }

  // 用户管理模块
  const UserBuriedEvent = (event: ClickBuriedProps) => {
    const payload = {
      module: '用户管理模块',
      page: '用户管理页面',
      event_type: '按钮',
      ...event
    }
    buriedEvent(payload)
  }
  return {
    buriedEvent,
    menuBuriedEvent,
    callWordBuriedEvent,
    fileLibBuriedEvent,
    pluginBuriedEvent,
    applicationBuriedEvent,
    skillsBuriedEvent,
    FirmBuriedEvent,
    UserBuriedEvent
  }
}
